package com.cqeec.demo.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期操作工具类
 * 
 * @Title: DateUtil
 * @Descripton: 对日期进行相应转换操作，可日期转数字也可数字转日期，还可转字符串
 */
public class DateUtil {
	/**
	 * 字符串转换为日期，调用方式：DateOperationUtil.stringToDate("2015-9-9", "yyyy-MM-dd HH:mm:ss");
	 * 
	 * @param time     要转换的字符串
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @return 转换后的日期
	 */
	public static Date stringToDate(String time, String pattern) {
		DateFormat dateFormat = new SimpleDateFormat(getPattern(pattern));
		try {
			return dateFormat.parse(time);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 日期转换为字符串，调用方式：DateOperationUtil.dateToString("2015-9-9", "yyyy-MM-dd HH:mm:ss");
	 * 
	 * @param time     要转换的日期
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @return 转换后的字符串
	 */
	public static String dateToString(Date time, String pattern) {
		DateFormat dateFormat = new SimpleDateFormat(getPattern(pattern));
		return dateFormat.format(time);
	}

	/**
	 * 字符串的日期转为10位时间戳，调用方式：DateOperationUtil.stringToTimestamp("2015-9-9", "yyyy-MM-dd HH:mm:ss");
	 * 
	 * @param time     要转换的日期字符串
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @return 返回10位长度整数
	 */
	public static Integer stringToTimestamp(String time, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(getPattern(pattern));
		try {
			return (int) (sdf.parse(time).getTime() / 1000);
		} catch (ParseException e) {
			return 0;
		}
	}

	/**
	 * 10位时间戳转换为日期字符串，调用方式：DateOperationUtil.timestampToString(1256112010, "yyyy-MM-dd HH:mm:ss");
	 * 
	 * @param time     10位时间戳
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @return 返回转换后的日期格式字符串
	 */
	public static String timestampToString(Integer time, String pattern) {
		long temp = (long) time * 1000;
		DateFormat sdf = new SimpleDateFormat(getPattern(pattern));
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(temp);
		return sdf.format(calendar.getTime());
	}

	/**
	 * 10位时间戳转换为日期对象，调用方式：DateOperationUtil.timestampToDate(1256112010);
	 * 
	 * @param time  10位时间戳
	 * @return 返回转换为后日期对象
	 */
	public static Date timestampToDate(Integer time) {
		long temp = (long) time * 1000;
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(temp);
		return calendar.getTime();
	}
	
	/**
	 * 获取指定日期的年份
	 * 
	 * @param date 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的四位年
	 */
	public static int getYear(String date, String pattern) {
		Date d = stringToDate(date, pattern);
		if ( null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.YEAR);
		} else {
			return -1;
		}
	}
	
	/**
	 * 获取指定日期的年份
	 * 
	 * @param d 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的四位年
	 */
	public static int getYear(Date d) {
		if ( null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.YEAR);
		} else {
			return -1;
		}
	}
	
	/**
	 * 获取指定日期的月份
	 * 
	 * @param date 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的月
	 */
	public static int getMonth(String date, String pattern) {
		Date d = stringToDate(date, pattern);
		if ( null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.MONTH) + 1;
		} else {
			return -1;
		}
	}
	
	/**
	 * 获取指定日期的月份
	 * 
	 * @param d 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的月
	 */
	public static int getMonth(Date d) {
		if ( null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.MONTH) + 1;
		} else {
			return -1;
		}
	}
	
	/**
	 * 获取指定日期的日
	 * 
	 * @param date 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的日
	 */
	public static int getDay(String date, String pattern) {
		Date d = stringToDate(date, pattern);
		if (null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.DATE);
		} else {
			return -1;
		}
	}
	
	/**
	 * 获取指定日期的日
	 * 
	 * @param d 日期
	 * @param pattern 转换格式
	 * @return 返回日期中的日
	 */
	public static int getDay(Date d) {
		if (null != d) {
			Calendar c = Calendar.getInstance();
			c.setTime(d);
			return c.get(Calendar.DATE);
		} else {
			return -1;
		}
	}

	/**
	 * Date类型转换为10位时间戳，调用方式：DateOperationUtil.timestampToDate(new Date("2015-4-2"));
	 * 
	 * @param time  在转换的日期对象
	 * @return 返回10位时间戳
	 */
	public static Integer dateToTimestamp(Date time) {
		return (int) (time.getTime() / 1000);
	}

	/**
	 * 设置转换格式
	 * 
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @return 返回匹配格式
	 */
	private static String getPattern(String pattern) {
		if (pattern == null || pattern.trim() == "") {
			pattern = "yyyy-MM-dd";
		}
		return pattern;
	}

	/**
	 * 返回指定日期加指定天数后的日期格式时间戳
	 * 
	 * @param time 要添加的日期格式时间戳
	 * @param day  要添加的天数，正数增加，负数减少
	 * @return 返回10位时间戳
	 */
	public static Integer specifiedDateAddDay(Integer time, int day) {
		Date date = timestampToDate(time);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, day);
		return DateUtil.dateToTimestamp(c.getTime());
	}

	/**
	 * 返回指定日期加指定天数后的日期格式字符串
	 * 
	 * @param time     指定的日期字符串
	 * @param pattern  转换格式，默认为yyyy-MM-dd
	 * @param day      要添加的天数，正数增加，负数减少
	 * @return 返回改变后的日期字符串
	 */
	public static String specifiedDateAddDay(String time, String pattern, int day) {
		SimpleDateFormat sdf = new SimpleDateFormat(getPattern(pattern));
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = sdf.parse(time);
			c.setTime(date);
			c.add(Calendar.DAY_OF_MONTH, day);
			return sdf.format(c.getTime());
		} catch (Exception e) {
			return "";
		}
	}
	
	/**
	 * 返回指定日期加指定天数后的日期格式时间戳
	 * 
	 * @param date     指定的日期
	 * @param day  要添加的天数，正数增加，负数减少
	 * @return 返回改变后的日期字符串
	 */
	public static Integer specifiedDateAddDay(Date date, int day) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, day);
		return DateUtil.dateToTimestamp(c.getTime());
	}

	/**
	 * 计算两个时间差 调用方式：DateOperationUtil.differentTime("2015-5-8 15:00",  "2015-6-9 15:00", "yyyy-MM-dd HH:mm");
	 * 
	 * @param smallTime 小的时间
	 * @param largeTime 大的时间
	 * @param pattern   日期匹配格式
	 * @return 返回相差的天数或小时数或分钟数字符串 如：1天前 2小时前
	 */
	public static String differentTime(String smallTime, String largeTime, String pattern) {
		if (null == smallTime || "".equals(smallTime)) {
			return "";
		}
		if (null == largeTime || "".equals(largeTime)) {
			return "";
		}
		
		Integer time1 = stringToTimestamp(smallTime, pattern);
		Integer time2 = stringToTimestamp(largeTime, pattern);

		int small = 0;
		int large = 0;
		
		if (time1 > time2) {
			small = time2;
			large = time1;
		} else if (time1 < time2) {
			small = time1;
			large = time2;
		} else {
			return "1秒钟前";
		}

		StringBuilder sb = new StringBuilder();

		int diff = large - small;
		int day = diff / (24 * 3600); // 天数
		if (day > 30) {
			return timestampToString(small, pattern);
		} else if (day > 0) {
			sb.append(day).append("天前");
		} else {
			int hour = diff / (60 * 60); // 小时
			if (hour > 0) {
				sb.append(hour).append("小时前");
			} else {
				int minute = diff / 60; // 分钟
				sb.append(minute).append("分钟前");
			}
		}
		return sb.toString();
	}
	
	/**
	 * 计算两个时间差 调用方式：DateOperationUtil.differentTime("2015-5-8 15:00",  "2015-6-9 15:00", "yyyy-MM-dd HH:mm");
	 * 
	 * @param smallTime 小的时间
	 * @param largeTime 大的时间
	 * @param pattern   日期匹配格式
	 * @return 返回相差的天数或小时数或分钟数字符串 如：1天前 2小时前
	 */
	public static String differentTime(Date smallTime, Date largeTime, String pattern) {
		if (null == smallTime || "".equals(smallTime)) {
			return "";
		}
		if (null == largeTime || "".equals(largeTime)) {
			return "";
		}
		
		Integer time1 = dateToTimestamp(smallTime);
		Integer time2 = dateToTimestamp(largeTime);

		int small = 0;
		int large = 0;
		
		if (time1 > time2) {
			small = time2;
			large = time1;
		} else if (time1 < time2) {
			small = time1;
			large = time2;
		} else {
			return "1秒钟前";
		}

		StringBuilder sb = new StringBuilder();

		int diff = large - small;
		int day = diff / (24 * 3600); // 天数
		if (day > 30) {
			return timestampToString(small, pattern);
		} else if (day > 0) {
			sb.append(day).append("天前");
		} else {
			int hour = diff / (60 * 60); // 小时
			if (hour > 0) {
				sb.append(hour).append("小时前");
			} else {
				int minute = diff / 60; // 分钟
				sb.append(minute).append("分钟前");
			}
		}
		return sb.toString();
	}
	
	/**
	 * 获取2个时间的差，返回多久前
	 * 
	 * @param beginTime  当前时间
	 * @param endTime    以前的时间
	 * @return String    返回类型
	 */
	public static String getTimeBefore(Date beginDate, Date endDate) {
		if (null == beginDate || "".equals(beginDate)) {
			return "";
		}
		if (null == endDate || "".equals(endDate)) {
			return "";
		}
		
		int beginTime = dateToTimestamp(beginDate);
		int endTime = dateToTimestamp(endDate);
		try {
			int result = beginTime - endTime;
			if (result < 60) {
				return result + "秒前";
			}
			
			result = result / 60; // 得到分钟数
			if (result < 60) {
				return result + "分钟前";
			}

			result = result / 60; // 得到小时数
			if (result < 24) {
				return result + "小时前";
			}

			result = result / 24; // 得到天数
			if (result <= 30) {
				return result + "天前";
			}
			
			return timestampToString(endTime, "yyyy-MM-dd HH:mm:ss");
		} catch (Exception e) {
			return "";
		}
	}
	
	/**
	 * 获取2个时间的差，返回多久前
	 * 
	 * @param beginTime  当前时间
	 * @param endTime    以前的时间
	 * @return String    返回类型
	 */
	public static String getTimeBefore(Integer beginTime, Integer endTime) {
		if (null == beginTime || beginTime <= 0) {
			return "";
		}
		if (null == endTime || endTime <= 0) {
			return "";
		}
		
		try {
			int result = beginTime - endTime;
			if (result < 60) {
				return result + "秒前";
			}
			
			result = result / 60; // 得到分钟数
			if (result < 60) {
				return result + "分钟前";
			}

			result = result / 60; // 得到小时数
			if (result < 24) {
				return result + "小时前";
			}

			result = result / 24; // 得到天数
			if (result <= 30) {
				return result + "天前";
			}
			
			return timestampToString(endTime, "yyyy-MM-dd HH:mm:ss");
		} catch (Exception e) {
			return "";
		}
	}

	/**
	 * 在日期基础上添加年，月，日，并返回10位时间戳
	 * 
	 * @param date 日期
	 * @param unit 单位，如：使用Calendar.MONTH
	 * @param num  添加数量
	 * @return
	 */
	public static Integer DateAdd(Date date, int unit, int num) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(unit, num);
		return DateUtil.dateToTimestamp(cal.getTime());
	}

	/**
	 * 根据时间戳 计算还有多少天过期
	 * 
	 * @param time  时间
	 * @return 0已过期，其它为还有多少天过期
	 */
	public static int getExpired(Integer time) {
		Date validDate = DateUtil.timestampToDate(time);
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		long begin = cal.getTimeInMillis();

		cal.setTime(validDate);
		long end = cal.getTimeInMillis();

		int diffDays = ((Long) ((end - begin) / (1000 * 3600 * 24))).intValue();

		if (diffDays <= 0) {
			return 0;
		} else {
			return diffDays;
		}
	}

	/**
	 * 返回指定日期与当前日期的差值，用于计算Token的有效期
	 * 
	 * @param dateString 指定日期，格式为：yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static Long getTimeDifference(String dateString) {
		Date date = null;
		try {
			date = stringToDate(dateString, "yyyy-MM-dd HH:mm:ss");
		} catch (Exception e) {
			date = new Date();
		}

		long old = date.getTime();
		long cur = System.currentTimeMillis();

		long minutes = (long) (cur - old) / 60 / 1000; //分钟

		return minutes;
	}

}
